#pragma once

#include <cstdint>
#include <memory>

#include "IFourierTransform.h"
#include "IBitmapData.h"

#include "ImportExport.h"

namespace FTLib
{
	void FTLIB_API TransformNewOutput(std::shared_ptr<IRealToComplex_PackedFftwComplex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output, const FourierTransformAdditional* pAdditional);

	void  FTLIB_API TransformNewOutput(std::shared_ptr<IRealToComplex_PackedIppComplex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output,const FourierTransformAdditional* pAdditional);

	void FTLIB_API TransformNewOutput(std::shared_ptr<IRealToComplex_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API TransformNewOutput(std::shared_ptr<IComplexToComplexFwd_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API TransformNewOutput(std::shared_ptr<IComplexToComplexInv_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API TransformNewOutput(std::shared_ptr<IComplexHermitianToReal> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData>& output, const FourierTransformAdditional* pAdditional);


	void FTLIB_API Transform(std::shared_ptr<IRealToComplex_PackedFftwComplex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);

	void  FTLIB_API Transform(std::shared_ptr<IRealToComplex_PackedIppComplex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API Transform(std::shared_ptr<IRealToComplex_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API Transform(std::shared_ptr<IComplexToComplexFwd_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API Transform(std::shared_ptr<IComplexToComplexInv_Complex> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);

	void FTLIB_API Transform(std::shared_ptr<IComplexHermitianToReal> transf, std::shared_ptr<IBitmapData> input, std::shared_ptr<IBitmapData> output, const FourierTransformAdditional* pAdditional);
};
